% clear all; close all; clc;
% Variables del problema
STATES = [123,132,213,231,312,...
          321,1023,1032,1203,1230,...
          1302,1320,2013,2031,2103,...
          2130,2301,2310,3012,3021,...
          3102,3120,3201,3210];
MOVES = [12,13,14,21,24,31,34,41,42,43];
GOAL = 1230;
LEARNING_CONSTANTS = dict;
LEARNING_CONSTANTS('alpha') = 0.5; % Coeficiente de aprendizaje
LEARNING_CONSTANTS('gamma') = 0.75; % Factor de descuento de la recompensa
LEARNING_CONSTANTS('cp') = 0.02; % Coeficiente de fluctuaciones de bias (L. Kocsis and C. Szepesvari, 2006, ultimo parrafo de la seccion 2.2)
% El coeficiente cp es crucial porque determina cuanto peso se le da a la
% exploracion de alternativas desconocidas. Si es muy chico, siempre se
% explora y si es muy grande nunca se explora.
DEPTH = 5; % Cantidad de movidas a futuro que se pueden planear
TIME = inf; % Tiempo que lo dejo planear
EXPLORE = 0;
ITERATIONS = 300; % Cantidad maxima de planes que puede planear

% Inicio las heuristicas que seleccionan el valor por default de los nodos
heu = heuristics(STATES,MOVES,GOAL,LEARNING_CONSTANTS);
h = heu.returnLambda([1,0]);

% Genero el nodo raiz

clear('n','p');
d = heu.solved.distance;
stas = STATES(d(STATES)>=2);
for i = 1:length(stas)
    n(i)=node(stas(i),stas(i),1,1,1);
    max_moves = heu.solved.distance(n(i).representation);
    % Creo el objeto plan
    p(i) = plan(n(i) , GOAL , max_moves+13 , transitions(STATES,MOVES) , LEARNING_CONSTANTS,...
             h , DEPTH , TIME , EXPLORE , ITERATIONS);
end
% Pido que se planee
salidas = cell(1,length(stas));
for i=1:length(stas)
    [salida] = p(i).planning;
    salidas{i} = salida;
    clear('p2','salida');
end

% if isa(salidas{1},'node')
%     rep = [salida.representation];
% elseif isa(salidas{1},'cell')
%     rep = cellfun(@(x)x.representation,salida);
% end
% disp(rep);
% disp(freqsal/ITERATIONS);
% 
% sta=zeros(size(p.nodes));
% val=zeros(size(p.nodes));
% for j=1:length(sta)
%     sta(j)=p.nodes{j}.representation;
%     val(j)=p.nodes{j}.value;
% end
% d = heu.solved.distance;
% plot(d(sta),val,'o','markerfacecolor','b')

% testPlanningEficiency(p.plans,heu.solved);

frac = zeros(1,length(stas));
N = frac;
for i = 1:length(stas)
    [frac(i),N(i)] = greatestHits(p(i).nodes,p(i).plans,p(i).plansId,...
                    'percentile',0.8,'goal',GOAL,'selected',salidas{i});
end

prob1 = prob_of_right(p,heu);
% x = d(stas);
% [x,ix] = sort(x);
% plot(x,prob1(ix),'.-')
[dat,des,cat] = curva_media(d(stas),prob1);
errorbar(cat,dat,des,'.');
hold on;
plot(cat,dat,'.-','markersize',12)
xlabel('Distancia','fontsize',14);
ylabel('Fraccion de planes correctos','fontsize',14);
% save prueba.mat